package map;

import javafx.print.Collation;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * Map的遍历:
 * Map提供了三种遍历方式:
 * 1.遍历所有的key
 * 2.遍历每一种键值对
 * 3.遍历所有的value(这个操作不常用)
 */
public class MapDemo2 {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        //如果希望遍历Map时的顺序与put顺序一致,可以使用LinkedHashMap
        //Map<String,Integer> map1 = new LinkedHashMap<>();
        map.put("语文",99);
        map.put("数学",98);
        map.put("英语",97);
        map.put("物理",96);
        map.put("化学",97);
        System.out.println(map);
        /*
            遍历所有的key
            Set<k> KeySet()
            将当前Map中所有的key以一个Set集合形式返回.遍历这个集合就等于遍历了所有的key
         */
        Set<String> keySet = map.keySet();
        for(String key : keySet){
            System.out.println("key:"+key);
        }

        Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
        for(Map.Entry<String,Integer> e : entrySet){
            String key = e.getKey();
            Integer value = e.getValue();
            System.out.println(key+":"+value);
        }

        Collection<Integer> values = map.values();
        for (Integer value : values){
            System.out.println("value:"+value);
        }

        //lambda表达式
        keySet.forEach(new Consumer<String>() {
            public void accept(String s) {
                System.out.println(s);
            }
        });

        //lambda表达式一个参数简写
        keySet.forEach(s-> System.out.println(s));
        /**
            在lambda表达式中,如果参数与调用方法中传入的参数一致时,可以简写为方法引用:
            e->对象.方法(e);
            可以写为:
                对象::方法
         */
        keySet.forEach(System.out::println);

        /**
         * Map也提供了forEach
         */
        //lambda表达式
        map.forEach(new BiConsumer<String, Integer>() {
            public void accept(String s, Integer integer) {
                System.out.println(s);
            }
        });
        //lambda表达式两个参数简写
        map.forEach((k,v)->System.out.println(k+":"+v));

    }
}
